package main

import (
	"errors"
	"fmt"
	"strconv"
)

// 求n的阶乘。至少使用递归函数完成一次
func factorial(n int) (int, error) {
	if n < 0 {
		return 0, errors.New("Error: 负数没有阶乘")
	}

	if n < 2 {
		return 1, nil
	}

	result, _ := factorial(n - 1)

	return n * result, nil
}

// n的阶乘循环班
func factorialLoop(n int) (int, error) {
	result := n
	if n < 0 {
		return 0, errors.New("Error: 负数没有阶乘")
	}

	for i := n; i > 1; i-- {
		result *= i - 1
	}

	return result, nil
}

// 编写一个函数，接受一个参数n，n为正整数。要求数字必须对齐
func triangle(n int) {
	var lastLine string

	if n <= 0 {
		fmt.Printf("参数必须大于0")
		return
	}

	for i := 1; i <= n; i++ {
		lastLine += fmt.Sprintf("%[1]s ", strconv.Itoa(i))
	}
	width := len(lastLine)

	for i := 1; i <= n; i++ {
		var line string
		for j := i; j > 0; j-- {
			line += fmt.Sprintf("%[1]s ", strconv.Itoa(j))
		}
		fmt.Printf("%[2]*[1]s", line, width)
		fmt.Println()
	}
}

func main() {
	n := 7
	result, err := factorial(n)
	if err != nil {
		fmt.Println(err)
	} else {
		fmt.Printf("%d的阶乘递归版: %d\n", n, result)
	}

	result, err = factorialLoop(n)
	if err != nil {
		fmt.Println(err)
	} else {
		fmt.Printf("%d的阶乘循环班: %d\n", n, result)
	}
	triangle(12)
}

// 批改意见
// 阶乘和输出倒三角的函数中都需要考虑n<=0的特殊情况
